import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.SQLException;

public class Client {
	private FenetreChat fenetreChat;
	private DialogConnexion dialogConnexion;
	private DialogCreerCompte dialogCreerCompte;
	private DialogCreerSalon dialogCreerSalon;
	private DialogRejoindreSalon dialogRejoindreSalon;
	private DialogSupprimerSalon dialogSupprimerSalon;
	
	private int port;
	private String hote;
	private Socket socket;

	private InputStream in;
	private OutputStream out;
	private DataInputStream entree;
	private DataOutputStream sortie;
	
	private String pseudo;
	private String motDePasse;
	
	public static void main(String[] args)
	{
		Client client = new Client();
	}
	
	public Client()
	{
		dialogConnexion = new DialogConnexion(this);
		dialogConnexion.setVisible(true);
	}
	
	public void ouvrirFenetreChat() {
		this.fenetreChat = new FenetreChat(this);
		this.fenetreChat.setVisible(true);
	}
	
	public void fermerDialogueConnexion()
	{
		this.dialogConnexion.dispose();
		this.dialogConnexion = null;
	}
	
	public void fermerFenetreChat()
	{
		this.fenetreChat.dispose();
		this.fenetreChat = null;
	}

	public void ouvrirDialogCreerCompte() {
		this.dialogCreerCompte = new DialogCreerCompte(this);
		this.dialogCreerCompte.setVisible(true);
	}

	public void fermerDialogCreerCompte() {
		this.dialogCreerCompte.dispose();
		this.dialogCreerCompte = null;
	}

	public void ouvrirDialogConnexion() {
		this.dialogConnexion = new DialogConnexion(this);
		this.dialogConnexion.setVisible(true);
	}

	public void ouvrirDialogCreerSalon() {
		this.dialogCreerSalon = new DialogCreerSalon(this);
		this.dialogCreerSalon.setVisible(true);
	}

	public void ouvrirDialogRejoindreSalon() throws SQLException, ClassNotFoundException {
		this.dialogRejoindreSalon = new DialogRejoindreSalon(this);
		this.dialogRejoindreSalon.setVisible(true);
	}

	public void ouvrirDialogSupprimerSalon() throws SQLException, ClassNotFoundException {
		this.dialogSupprimerSalon = new DialogSupprimerSalon(this);
		this.dialogSupprimerSalon.setVisible(true);
	}

	public void fermerDialogCreerSalon() {
		this.dialogCreerSalon.dispose();
		this.dialogCreerSalon = null;
	}

	public void fermerDialogRejoindreSalon() {
		this.dialogRejoindreSalon.dispose();
		this.dialogRejoindreSalon = null;
	}

	public void fermerDialogSupprimerSalon() {
		this.dialogSupprimerSalon.dispose();
		this.dialogSupprimerSalon = null;
	}
	
	public boolean ouvrirConnexion(int port, String hote, String pseudo, String motDePasse)
	{
		int codeRetour = 0;
		this.port = port;
		this.hote = hote;
		try {
			this.socket = new Socket(hote, port);
		}
		catch (UnknownHostException e)
		{
			System.out.println("Erreur : le serveur " + hote + " n'existe pas.");
		}
		catch (IOException e)
		{
			System.out.println("Erreur : le serveur " + hote + " existe mais n'est pas le bon ou le numéro de port n'est pas le bon.");
		}
		recupererFlot();
		
		try {
			sortie.writeInt(CodesTchat.codeConnexion);
			sortie.writeUTF(pseudo);
			sortie.writeUTF(motDePasse);
			codeRetour = entree.readInt();
			if (codeRetour == CodesTchat.codeConnexionOK)
			{
				int nbSalons = entree.readInt();
				for(int i = 0 ; i < nbSalons ; i++)
				{
					String nomSalon = entree.readUTF();
				}
			}
		}
		catch (Exception e)
		{
			System.out.println("Erreur de transfert des données");
		}
		return (codeRetour == CodesTchat.codeConnexionOK);
	}

	public void recupererFlot()
	{
		try {
			this.in = socket.getInputStream();
			this.out = socket.getOutputStream();
			this.entree = new DataInputStream(in);
			this.sortie = new DataOutputStream(out);
		}
		catch (Exception e)
		{
			System.out.println("Erreur de récupération des flots de données");
		}
	}

	public void fermerConnexion()
	{
		try {
			sortie.writeInt(CodesTchat.codeDeconnexion);
			this.socket.close();
		}
		catch (Exception e)
		{System.out.println("Erreur fermeture connexion");}
	}

	public boolean creerSalon(String nomSalon, String mdp, String description,int nbPlaces) {
		int codeRetour = 0;
		try {
			sortie.writeInt(CodesTchat.codeCreationSalon);
			sortie.writeUTF(nomSalon);
			sortie.writeUTF(mdp);
			sortie.writeUTF(description);
			sortie.writeInt(nbPlaces);

			codeRetour = entree.readInt();
		}
		catch (Exception e)
		{
			System.out.println("Erreur de transfert des données");
		}
		
		return (codeRetour == CodesTchat.codeSalonCree);
	}

	public boolean creerCompte(String pseudo, String password, String email) {
		
		this.ouvrirConnexion(2000, "localhost", "attente", "attente"); // Pour créer un compte il faut pouvoir être connecté sur le serveur.
		
		int codeRetour = 0;
		try {
			sortie.writeInt(CodesTchat.codeCreerCompte);
			sortie.writeUTF(pseudo);
			sortie.writeUTF(password);
			sortie.writeUTF(email);
			
			codeRetour = entree.readInt();		
		}
		catch (Exception e)
		{
			System.out.println("Erreur de transfert des données pour la création du nouveau compte !");
		}
		
		this.fermerConnexion(); // On déconnecte le client du serveur pour qu'il puisse saisir ses identifiants
		
		return (codeRetour == CodesTchat.codeCompteCree);
	}

	public boolean supprimerSalon(String salon, String password) {
		int codeRetour = 0;
		try {
			sortie.writeInt(CodesTchat.codeSupprimerSalon);
			sortie.writeUTF(salon);
			sortie.writeUTF(password);
			
			codeRetour = entree.readInt();
		}
		catch (Exception e)
		{
			System.out.println("Erreur de transfert des données pour la suppression du salon !");
		}
		return (codeRetour == CodesTchat.codeSalonSupprime);
	}

	public boolean rejoindreSalon(String salon, String password) {
		int codeRetour = 0;
		
		try {
			sortie.writeInt(CodesTchat.codeRejoindreSalon);
			sortie.writeUTF(salon);
			sortie.writeUTF(password);
			
			codeRetour = entree.readInt();
			
			if (codeRetour == CodesTchat.codeSalonDisponible)
			{
				int nbTchateurs = entree.readInt();
				for(int i = 0 ; i < nbTchateurs ; i++)
				{
					String nomTchateur = entree.readUTF();
					
				}
			}
		}
			catch (Exception e)
			{
				System.out.println("Erreur de transfert des données pour rejoindre un salon !");
			}
			return (codeRetour == CodesTchat.codeSalonDisponible);
	}
}
